package interfaceGrafica;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import jogo.Casas;
import jogo.Tabuleiro;

public class Gui extends JFrame implements ActionListener {

      
        /**
         * SerialVersion
         */
        private static final long serialVersionUID = 1L;

        private JButton[] buttons = new JButton[37];
        private JTextField jTextNivel = new JTextField();
        private JLabel jLabelNivel = new JLabel();
        
        private Map<JButton, Casas> mapaTabuleiro = new HashMap<JButton, Casas>();
        
        
        private ImageIcon iconWhite = new ImageIcon(getClass().getResource("/images/peca.png"));
        private ImageIcon iconBlack = new ImageIcon(getClass().getResource("/images/pecapreta.png"));
        private ImageIcon iconKingWhite = new ImageIcon(getClass().getResource("/images/dama.png"));
        private ImageIcon iconKingBlack = new ImageIcon(getClass().getResource("/images/damapreta.png"));
     
        private Tabuleiro tabuleiro;
        boolean heuristica = true;
        int buscaCega = 0;
        int nivel = 1;
       
        int[] vetor = {0,2,4,6,9,11,13,15,16,18,20,22,25,27,29,31,32,34,36,38,41,43,45,47,48,50,52,54,57,59,61,63};
       
        /** Creates new form Tabuleiro */
        public Gui() {
                initComponents();
        }
        
        private void initComponents() {
            Color black = new Color(102, 102, 102);
            int coluna = 20;
            int linha =0;
            tabuleiro = new Tabuleiro();
            tabuleiro.iniciarTabuleiro();
            tabuleiro.imprimirTabuleiro();
           
            int[] vetor = {0,2,4,6,9,11,13,15,16,18,20,22,25,27,29,31,32,34,36,38,41,43,45,47,48,50,52,54,57,59,61,63};
            
            for (int i = 31; i >=0; i--) {
                buttons[i] = new JButton();
                buttons[i].setBackground(black);
    			getContentPane().add(buttons[i]);
                buttons[i].setBounds(coluna, linha, 89, 89);
                if (tabuleiro.casa[vetor[i]].getPeça()!=null) {
            		if (tabuleiro.casa[vetor[i]].getPeça().getJogador() == -1) buttons[i].setIcon(iconBlack);
                    else buttons[i].setIcon(iconWhite);                  	
                }
                
                buttons[i].addActionListener(this);
                mapaTabuleiro.put(buttons[i], tabuleiro.casa[vetor[i]]);
                if (coluna == 560 )
                {
                        coluna = 110;
                        linha += 90;
                        continue;
                }
                if (coluna == 650 )
                {
                        coluna = 20;
                        linha += 90;
                        continue;
                }
                coluna += 180;
               
            }
            jLabelNivel.setText("Nível: ");
            getContentPane().add(jLabelNivel);
            jLabelNivel.setBounds(750,150, 60, 30);
            
            getContentPane().add(jTextNivel);
            jTextNivel.setBounds(820,150, 30, 30);
            jTextNivel.setText(String.valueOf(nivel));
            
            buttons[32] = new JButton();
            buttons[32].setText("OK");
			getContentPane().add(buttons[32]);
            buttons[32].setBounds(870,150, 60, 30);
            buttons[32].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButtonNivelActionPerformed(evt);
                }

				private void jButtonNivelActionPerformed(ActionEvent evt) {
					try{
						nivel = Integer.parseInt(jTextNivel.getText());	
					}catch(NumberFormatException nfe){
						nivel = 1;
					}
				}
            });
            
            buttons[33] = new JButton();
            buttons[33].setText("Busca em profundidade");
			getContentPane().add(buttons[33]);
            buttons[33].setBounds(750,250, 250, 40);
            buttons[33].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButtonDFSActionPerformed(evt);
                }

				private void jButtonDFSActionPerformed(ActionEvent evt) {
					buscaCega = 1;
					heuristica = false;					
				}
            });
            buttons[34] = new JButton();
            buttons[34].setText("Busca em largura");
			getContentPane().add(buttons[34]);
            buttons[34].setBounds(750,300, 250, 40);
            
            buttons[34].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButtonBFSActionPerformed(evt);
                }

				private void jButtonBFSActionPerformed(ActionEvent evt) {
					buscaCega = 0;
					heuristica = false;						
				}
            });
            
            buttons[35] = new JButton();
            buttons[35].setText("Heurística");
			getContentPane().add(buttons[35]);
            buttons[35].setBounds(750,350, 250, 40);
            
            buttons[35].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButtonHeuristicaActionPerformed(evt);
                }

				private void jButtonHeuristicaActionPerformed(ActionEvent evt) {
					buscaCega = 0;
					heuristica = true;
				}
            });
            
            buttons[36] = new JButton();
            buttons[36].setText("Reiniciar Jogo");
			getContentPane().add(buttons[36]);
            buttons[36].setBounds(750,400, 250, 40);
            
            buttons[36].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButtonReiniciarActionPerformed(evt);
                }

				private void jButtonReiniciarActionPerformed(ActionEvent evt) {
					 tabuleiro = new Tabuleiro();
			         tabuleiro.iniciarTabuleiro();
			         heuristica = true;
			         buscaCega = 0;
			         nivel = 1;
			         atualizaTabuleiro();
				}
            });
            
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setMinimumSize(new java.awt.Dimension(1024, 850));
            setResizable(false);
            getContentPane().setLayout(null);
            atualizaTabuleiro();
            pack();
        }
        public void actionPerformed(ActionEvent e) {
        	if(tabuleiro.fimJogo()) return;
        	jTextNivel.setText(String.valueOf(nivel));
        	System.out.println("JogadorAtual: " + tabuleiro.jogadorAtual);
        	if(tabuleiro.movimentos % 2 ==0) {
        		tabuleiro.jogadorAtual = 1;
	        	tabuleiro.obrigatoria = tabuleiro.verificaObrigatoria(tabuleiro.getJogador(tabuleiro.jogadorAtual));
	        	
	        	Set<Casas> chaves = tabuleiro.obrigatoria.keySet(); 
	    		int max = 0;
	    		int cont=0;
	        	for(Casas casa: chaves){
	    			cont = tabuleiro.obrigatoria.get(casa);
	    			if(cont == max) tabuleiro.listObrigatoriaInicial.add(casa);
	    			if(cont > max) {
	    				tabuleiro.listObrigatoriaInicial.clear();
	    				tabuleiro.listObrigatoriaInicial.add(casa);
	    				max = cont;
	    			}
	    		}
	        	
	        	if (e.getSource() instanceof JButton) {
	            	if (tabuleiro.casaInicial == null) {
	            		if (mapaTabuleiro.get(e.getSource()).getPeça() != null) {
	            			if (tabuleiro.obrigatoria.isEmpty()) {
	            				tabuleiro.casaInicial = (Casas) mapaTabuleiro.get(e.getSource());
	            			} else {
	            				if (tabuleiro.listObrigatoriaInicial.contains(mapaTabuleiro.get(e.getSource()))) {
	            					tabuleiro.casaInicial = (Casas) mapaTabuleiro.get(e.getSource());
	            					tabuleiro.criarListaCasasObrigatorias();
	            				}
	            			}
	            		}
	            	} else if (tabuleiro.casaInicial != null) {
	            		if (mapaTabuleiro.get(e.getSource()).getPeça() != null) {
	                		if (tabuleiro.obrigatoria.isEmpty()) {
	                			tabuleiro.casaInicial = (Casas) mapaTabuleiro.get(e.getSource());
	            			} else {
	            				if (tabuleiro.listObrigatoriaInicial.contains(mapaTabuleiro.get(e.getSource()))) {
	            					tabuleiro.casaInicial = (Casas) mapaTabuleiro.get(e.getSource()); 
	            					tabuleiro.criarListaCasasObrigatorias();
	            				}
	            				else{
	            					tabuleiro.casaInicial = (Casas) mapaTabuleiro.get(e.getSource()); 
	            					tabuleiro.listObrigatoriaFinal.clear();
	            				}
	            			}
	            		} else {
	            				if (mapaTabuleiro.get(e.getSource()).getPeça() == null) {
	            					if (tabuleiro.listObrigatoriaFinal.isEmpty()){
	            						tabuleiro.casaFinal = (Casas) mapaTabuleiro.get(e.getSource());
	            						if(tabuleiro.verificarMovimentoValido(tabuleiro.casaInicial.getPos(), tabuleiro.casaFinal.getPos(), tabuleiro.jogadorAtual)){
			            					if(tabuleiro.moverPeça(tabuleiro.casaInicial.getPeça().getPosicao(), tabuleiro.casaFinal.getPos(), tabuleiro.jogadorAtual)){
			            						tabuleiro.tornarDama(tabuleiro.casaFinal.getPeça(),tabuleiro.jogadorAtual);
			            						
			            						atualizaTabuleiro();
			            						tabuleiro.movimentos++;
			            						System.out.println("MOVIMENTOS:"+tabuleiro.movimentos);
			            						tabuleiro.jogadorAtual = -1; 
			            						System.out.println("JogadorAtual: " + tabuleiro.jogadorAtual);
			            						if(!tabuleiro.fimJogo()){
				            						tabuleiro.casaInicial = null;
				            						tabuleiro.casaFinal = null;
				            						tabuleiro.casaCaptura = null;
				            						
					            					System.out.println("\n\n");
					            				    Tabuleiro.tabuleiroAtual = new Tabuleiro(tabuleiro.casa, tabuleiro.movimentos, 
					            							tabuleiro.avaliacao, tabuleiro.getJogador(tabuleiro.jogadorAtual*-1),tabuleiro.getJogador(tabuleiro.jogadorAtual));
					            				    if(buscaCega ==0) tabuleiro = tabuleiro.criarJogadasBFS(nivel, tabuleiro.movimentos,heuristica);
					            				    else tabuleiro = tabuleiro.criarJogadasDFS(nivel, tabuleiro.movimentos);
					            				    System.out.println("\n\n");
					            				    atualizaTabuleiro();
					            			        tabuleiro.jogadorAtual = 1;
			            							tabuleiro.fimJogo();
					            				}
			            						atualizaTabuleiro();
			            					}
			            				}
	            						tabuleiro.casaInicial = null;
	            						tabuleiro.casaFinal = null;
	            						tabuleiro.casaCaptura = null;
	            					}else{
	            						
	            						if(tabuleiro.listObrigatoriaFinal.contains(mapaTabuleiro.get(e.getSource()))){
	            							
	            							tabuleiro.casaFinal = (Casas) mapaTabuleiro.get(e.getSource());
	            							tabuleiro.capturaPeça(tabuleiro.casaInicial.getPeça().isDama());
	            							atualizaTabuleiro();
	            							if(tabuleiro.movimentos %2==1){
	            								tabuleiro.jogadorAtual = -1; 
		            							if(!tabuleiro.fimJogo()){
		            								tabuleiro.casaInicial = null;
			            							tabuleiro.casaFinal = null;
			            							tabuleiro.casaCaptura = null;
			            							Tabuleiro.tabuleiroAtual = new Tabuleiro(tabuleiro.casa, tabuleiro.movimentos, 
				            								tabuleiro.avaliacao, tabuleiro.getJogador(tabuleiro.jogadorAtual*-1),tabuleiro.getJogador(tabuleiro.jogadorAtual));
			            							if(buscaCega ==0) tabuleiro = tabuleiro.criarJogadasBFS(nivel, tabuleiro.movimentos,heuristica);
			            							else tabuleiro = tabuleiro.criarJogadasDFS(nivel, tabuleiro.movimentos);
			            							atualizaTabuleiro();
			            							tabuleiro.jogadorAtual = 1;
			            							tabuleiro.fimJogo();		            							
		            							}
	            							}
	            						}
	            					}
	            			}
	            		}
	            	}
	            } 
        	}        	
        }
        
        public void atualizaTabuleiro() {
        	mapaTabuleiro.clear();
        	for (int i = 31; i >=0; i--) {
        		if (tabuleiro.casa[vetor[i]].getPeça() != null) {
        			if (!tabuleiro.casa[vetor[i]].getPeça().isDama()) {
        				if (tabuleiro.casa[vetor[i]].getPeça().getJogador() ==-1)
        					buttons[i].setIcon(iconBlack);
                    	if (tabuleiro.casa[vetor[i]].getPeça().getJogador() == 1)
                    		buttons[i].setIcon(iconWhite);
        			} else {
                    	if (tabuleiro.casa[vetor[i]].getPeça().getJogador() ==1)
                    		buttons[i].setIcon(iconKingWhite);
                    	if (tabuleiro.casa[vetor[i]].getPeça().getJogador() == -1)
                    		buttons[i].setIcon(iconKingBlack);
                   	}
        		} else {
        			buttons[i].setIcon(null);
                }
                mapaTabuleiro.put(buttons[i], tabuleiro.casa[vetor[i]]);
        	}
        }

        public static void main(String args[]) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                        public void run() {
                                new Gui().setVisible(true);
                        }
                });
        }
}